package edu.fudan.jwxt.Aspect;

import edu.fudan.jwxt.Exception.ServiceException;
import edu.fudan.jwxt.common.Constants;
import edu.fudan.jwxt.common.RoleConstant;
import edu.fudan.jwxt.entity.User;
import edu.fudan.jwxt.utils.TokenUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Aspect
@Component
public class UserAspect {

    //定义切面表达式
    // @Pointcut("@???(edu.fudan.jwxt.annotation.Adminer)")
    // public void Adminer(){}

    // @???("@annotation(edu.fudan.jwxt.annotation.Teacher)")
    // public void Teacher(){}

    // @Pointcut("@annotation(edu.fudan.jwxt.annotation.AdminerOrTeacher)")
    // public void AdminOrTeacher(){}

    //用户权限检查
    //TODO: 使用AOP的环绕方法解释注解Adminer的Adminer方法
    // @???(value = "Adminer()")
    // public Object AdminerCheck(ProceedingJoinPoint pjp) throws Throwable {
    //     User currentUser = TokenUtils.getCurrentUser();
    //     System.out.println(currentUser.getRole());
    //     System.out.println(RoleConstant.ADMIN);
    //     if(???)
    //         //TODO 抛出非法使用异常;
    //     if(???)
    //         //TODO 抛出权限不足异常;
    //     return ???;
    // }

    //TODO: 使用AOP的环绕方法解释注解Teacher的Teacher方法
    // @???(value = "Teacher()")
    // public Object TeacherCheck(ProceedingJoinPoint pjp) throws Throwable {
    //     User currentUser = TokenUtils.getCurrentUser();
    //     if(???)
    //         //TODO 抛出非法使用异常;
    //     if(???)
    //         //TODO 抛出权限不足异常;
    //     return ???
    // }

    //TODO: 使用AOP的环绕方法解释注解AdminOrTeacher的AdminOrTeacher方法
    // @Around(value = "AdminOrTeacher()")
    // public Object AdminOrTeacherCheck(ProceedingJoinPoint pjp) throws Throwable {
    //     User currentUser = TokenUtils.getCurrentUser();
    //     if(???)
    //         //TODO 抛出非法使用异常;
    //     if(???)
    //         //TODO 抛出权限不足异常;
    //     return ???
    // }

    // 定义切面表达式，用于匹配使用了 @Adminer 注解的方法
    @Pointcut("@annotation(edu.fudan.jwxt.annotation.Adminer)")
    public void Adminer(){}

    // 对使用了 @Adminer 注解的方法进行环绕增强
    @Around(value = "Adminer()")
    public Object AdminerCheck(ProceedingJoinPoint pjp) throws Throwable {
        User currentUser = TokenUtils.getCurrentUser();
        // 判断当前用户是否为管理员
        if(!RoleConstant.ADMIN.equals(currentUser.getRole()))
            throw new ForbiddenException("非法使用，权限不足");
        return pjp.proceed();
    }

    // 定义切面表达式，用于匹配使用了 @Teacher 注解的方法
    @Pointcut("@annotation(edu.fudan.jwxt.annotation.Teacher)")
    public void Teacher(){}

    // 对使用了 @Teacher 注解的方法进行环绕增强
    @Around(value = "Teacher()")
    public Object TeacherCheck(ProceedingJoinPoint pjp) throws Throwable {
        User currentUser = TokenUtils.getCurrentUser();
        // 判断当前用户是否为教师
        if(!RoleConstant.TEACHER.equals(currentUser.getRole()))
            throw new ForbiddenException("非法使用，权限不足");
        return pjp.proceed();
    }

    // 定义切面表达式，用于匹配使用了 @AdminerOrTeacher 注解的方法
    @Pointcut("@annotation(edu.fudan.jwxt.annotation.AdminerOrTeacher)")
    public void AdminOrTeacher(){}

    // 对使用了 @AdminerOrTeacher 注解的方法进行环绕增强
    @Around(value = "AdminOrTeacher()")
    public Object AdminOrTeacherCheck(ProceedingJoinPoint pjp) throws Throwable {
        User currentUser = TokenUtils.getCurrentUser();
        // 判断当前用户是否为管理员或教师
        if(!RoleConstant.ADMIN.equals(currentUser.getRole()) && !RoleConstant.TEACHER.equals(currentUser.getRole()))
            throw new ForbiddenException("非法使用，权限不足");
        return pjp.proceed();
    }

    private class ForbiddenException extends Throwable {
        public ForbiddenException(String s) {
            System.out.println(s);
        }
    }
}

